package com.xgr.wonderful.utils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
import java.util.Set;
import org.json.JSONException;
import org.json.JSONObject;
import com.xgr.wonderful.entity.Status;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

public class Cache {
	private static final String TAG = "Cache" ;
	
	public static final String CACHE_FILE_PATH ="data/data/com.xgr.wonderful/files/cachejson";
	public static final String CACHE_USER_PUBLISED_STATUS = "user_publish";
	public static final String CACHE_USER_REPLIED_STATUS = "user_replied";
	public static final String CACHE_USER_STATUS = "status";
	public static final String CACHE_USER_LIKE_RELATIONS = "user_like_relations"; 
	
	public static final String CACHE_COMMENT_RECEIVED_STATUS = "comment_received_status";

	// 参数是一个list<status>对象对应的json格式的字符串
//	public static void putUserStatus(String value) {
//		putCache(CACHE_USER_STATUS, value);
//	}
	/**
	 * 清除的话，直接写入null 
	 * @param value  List<Status> json化
	 */
	public static void putCommentReceivedStatus (String value){
		putCache(CACHE_COMMENT_RECEIVED_STATUS, value);
	}
//
//	public static void putUserPublishedStatus(String value) {
//		putCache(CACHE_USER_PUBLISED_STATUS, value);
//	}
//
//	public static void putUserRepliedStatus(String value) {
//		putCache(CACHE_USER_REPLIED_STATUS, value);
//	}
//	
	public static void putUserLikeRelations(String value) {
		LogUtils.i(TAG, "putUserLikeRelations value:"+ value) ; 
		putCache(CACHE_USER_LIKE_RELATIONS, value);
	}
//
	// 参数key目前只有userInfo和status
	// 每次更新主界面的“状态”列表以及“我发表的”界面的列表都会进行列表内容的缓存
	private static void putCache(String key, String value) {

		File cache = new File(CACHE_FILE_PATH);
		FileWriter writer = null;
		try {
			JSONObject object = null;
			String s = readCache();
			if (s != null && s.length() > 0) {
				try {
					// 使用json格式的字符串来初始化一个json对象
					// 这个字符串来自于缓存文件
					object = new JSONObject(s);
				} catch (JSONException e) {
					e.printStackTrace();
				}
			} else {
				object = new JSONObject();
			}
			writer = new FileWriter(cache);
			try {
				// 给json对象添加名字?
				// value会覆盖已有的值
				object.put(key, value);
			} catch (JSONException e1) {
				e1.printStackTrace();
			}
			// 一个json对象对应的字符串写入文件
			writer.write(object.toString());
			writer.flush();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (writer != null)
					writer.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	
//	public static List<Status> getUserStatus() {
//		return getCache(CACHE_USER_STATUS);
//	}
	/**
	 * @return
	 */
	public static List <Status> getCommentRecevicedStatus (){
		return getCache(CACHE_COMMENT_RECEIVED_STATUS) ;
	}
//	
//	public static List<Status> getUserPublishedStatus() {
//		return getCache(CACHE_USER_PUBLISED_STATUS);
//	}
//
//	public static List<Status> getUserRepliedStatus() {
//		return getCache(CACHE_USER_REPLIED_STATUS);
//	}
	
	// 利用java的泛型不知道可不可以将这个函数和下面的getCache函数合并
	public static Set<Integer> getUserLikeRelations() {
		Set<Integer> set = null;
		String result = readCache(CACHE_USER_LIKE_RELATIONS);
		if (result.length() == 0) {
			return null;
		}
		set = new Gson().fromJson(result, new TypeToken<Set<Integer>>() {
		}.getType());
		return set;
	}
	/**
	 * 先从file里面读出相应的String ，再json化，再取出
	 * status list 
	 * @param key
	 * @return
	 */
	private static List<Status> getCache(String key) {
		List<Status> list = null;
		String result = readCache(key);
		if (result.length() == 0)
			return null;
		list = new Gson().fromJson(result, new TypeToken<List<Status>>() {
		}.getType());
		return list;
	}
	
	/**
	 * 读出key对应的内容 ，如果 没有内容or对应的名字对象 不存在，
	 * 返回空String 对象 
	 * @param key  从整个文件里面查询的key 
	 * @return  json化整个文件，再取出key对应的
	 */
	public static String readCache(String key) {
		String s = readCache();
		String result = "";
		if (s != null && s.length() > 0) {
			try {
				JSONObject object = new JSONObject(s);
				// 按名字取出对应的值
				result = object.optString(key);
			} catch (JSONException e) {
				e.printStackTrace();
			}
		}
		return result;
	}

	/**
	 * 使用FileReader(file)、readLine()读取文件，
	 * 以行为单位，一次读一行，一直读到null时结束.返回的是String 
	 * @return  整个文件
	 */
	public static String readCache() {

		// 像这个cache文件可以被清除吗
		// 卸载WeiX的时候可不可以
		File cache = new File(CACHE_FILE_PATH);
		FileReader reader = null;
		BufferedReader buffer = null;
		StringBuffer json = new StringBuffer(); //效率更高
		try {
			reader = new FileReader(cache);
			buffer = new BufferedReader(reader);
			String line = null;
			// 缓存文件中的内容按行排列的?
			// 应该整个文件内容只有一行吧
			while ((line = buffer.readLine()) != null) {
				json .append(line);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}

		if (buffer != null) {
			try {
				buffer.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return json.toString();
	}
}
